//
// Created by ASUS on 2024/11/22/星期五.
//
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int mod=1e9+7;

int fast_pow(int a,int b){
	int c=1;
	while(b){
		if(b&1)c=c*a%mod;
		b/=2;
		a=a*a%mod;
	}
	return c;
}

struct Node{
	int l,r;
	int lazy;
	int s,prod;
};

class SegmentTree{
private:
	vector<Node> t;
public:
	SegmentTree(int n){
		t.resize(4*n);
	}

	void pushdown(int i){
		if(t[i].lazy){
			int x=t[i].lazy;
			t[2*i].lazy=x;
			t[2*i+1].lazy=x;
			if(x==1){
				t[2*i].s=t[2*i].r-t[2*i].l+1;
				t[2*i].prod=1;
				t[2*i+1].s=t[2*i+1].r-t[2*i+1].l+1;
				t[2*i+1].prod=1;
			}else{
				t[2*i].s=(fast_pow(x,t[2*i].r-t[2*i].l+1)-1+mod)%mod*x%mod*fast_pow(x-1,mod-2)%mod;
				t[2*i].prod=fast_pow(x,t[2*i].r-t[2*i].l+1);
				t[2*i+1].s=(fast_pow(x,t[2*i+1].r-t[2*i+1].l+1)-1+mod)%mod*x%mod*fast_pow(x-1,mod-2)%mod;
				t[2*i+1].prod=fast_pow(x,t[2*i+1].r-t[2*i+1].l+1);
			}
			t[i].lazy=0;
		}
	}

	void pushup(int i){
		t[i].prod=t[2*i].prod*t[2*i+1].prod%mod;
		t[i].s=(t[2*i].s+t[2*i+1].s*t[2*i].prod%mod)%mod;
	}

	void build(int i,int l,int r,vector<int>&b){
		t[i].l=l;
		t[i].r=r;
		if(l==r){
			t[i].s=t[i].prod=b[l];
			return;
		}
		int mid=l+(r-l)/2;
		build(2*i,l,mid,b);
		build(2*i+1,mid+1,r,b);
		pushup(i);
	}

	void update(int i,int l,int r,int x){
		if(t[i].r<l||t[i].l>r) return;
		if(t[i].l>=l&&t[i].r<=r){
			t[i].lazy=x;
			if(x==1){
				t[i].s=t[i].r-t[i].l+1;
				t[i].prod=1;
			}else{
				t[i].s=(fast_pow(x,t[i].r-t[i].l+1)-1+mod)%mod*x%mod*fast_pow(x-1,mod-2)%mod;
				t[i].prod=fast_pow(x,t[i].r-t[i].l+1);
			}
			return;
		}
		pushdown(i);
		update(2*i,l,r,x);
		update(2*i+1,l,r,x);
		pushup(i);
	}

	Node query(int i,int l,int r){
		if(t[i].r<l||t[i].l>r) {
			Node fail;
			fail.s=0;
			fail.prod=1;
			return fail;
		}
		if(t[i].l>=l&&t[i].r<=r){
			return t[i];
		}
		pushdown(i);
		Node left=query(2*i,l,r);
		Node right=query(2*i+1,l,r);
		if(left.s==0) return right;
		Node res;
		res.s=(left.s+right.s*left.prod%mod)%mod;
		res.prod=left.prod*right.prod%mod;
		return res;
	}
};
signed main() {
	int n,q;
	cin>>n>>q;
	vector<int> a(n+1);
	for (int i=1;i<=n;i++){
		cin>>a[i];
	}
	SegmentTree seg(n);
	seg.build(1,1,n,a);
	while(q--){
		int op;cin>>op;
		if(op==1){
			int l,r,x;
			cin>>l>>r>>x;
			seg.update(1,l,r,x);
		}else{
			int l,r;
			cin>>l>>r;
			cout<<seg.query(1,l,r).s<<"\n";
		}
	}
	return 0;
}